(deftemplate stanGosposi
	(slot stan)
	(slot zmeczenie)
	(slot zmeczenieMax)
	(slot czasDoZakonczenia)
)

(deftemplate czas
	(slot godzina)
	(slot minuta)
)

(deftemplate stanPokoju
	(slot poziomCzystosci)
)


(deftemplate stanKuchni
	(slot poziomCzystosci)
	(slot iloscSmieci)
	(slot iloscJedzenia)
	(slot iloscNaczyn)
)

(deftemplate stanLazienki
	(slot poziomCzystosci)
	(slot iloscBrudnychRzeczy)
	(slot iloscSrodkowCzystosci)
)

(deftemplate decyzja
	(slot czynnosc)
	(slot cel)
	(multislot args)
)

(deftemplate jaki-posilek
	(slot posilek) ;sniadanie, obiad, kolacja
)
;;;;;;;;;;;;
(defrule czy-g-moze-pracowac
	(stanGosposi (zmeczenie ?z) (zmeczenieMax ?zm&:(< ?z (- ?zm 200))))
	(stanGosposi (stan WOLNA))
	(czas (godzina ?g&:(> ?g 6)&:(< ?g 21)) (minuta ?))
	(or
		(czas (godzina ?) (minuta ?m&:(eq ?m 0)))
		(czas (godzina ?) (minuta ?m&:(eq ?m 15)))
		(czas (godzina ?) (minuta ?m&:(eq ?m 30)))
		(czas (godzina ?) (minuta ?m&:(eq ?m 45)))
	)
=>
	(assert (g-moze-pracowac TAK))
	;(printout t "GOSPOSIA, WOLNA" crlf)
)

(defrule czy-zakupy
	(g-moze-pracowac TAK)
	;(czas (godzina ?g&:(eq ?g 7)) (minuta ?))
	(or 
		(stanKuchni (iloscJedzenia ?ij&:(< ?ij 20)))
		(stanLazienki (iloscSrodkowCzystosci ?isc&:(< ?isc 20)))
	)
=>
	(assert (decyzja (czynnosc ZAKUPY)))
	;(printout t "GOSPOSIA, ZAKUPY" crlf)
)

(defrule czy-s-pokoj
	(g-moze-pracowac TAK)
	(stanPokoju (poziomCzystosci ?pc&:(< ?pc 60)))
=>
	(assert (decyzja (czynnosc SPRZATANIE) (cel POKOJ)))
)

(defrule czy-s-kuchnia
	(g-moze-pracowac TAK)
	(stanKuchni (poziomCzystosci ?pc&:(< ?pc 60)))
=>
	(assert (decyzja (czynnosc SPRZATANIE) (cel KUCHNIA)))
)

(defrule czy-s-lazienka
	(g-moze-pracowac TAK)
	(stanLazienki (poziomCzystosci ?pc&:(< ?pc 60)))
=>
	(assert (decyzja (czynnosc SPRZATANIE) (cel LAZIENKA)))
)

(defrule czy-zmywanie
	(g-moze-pracowac TAK)
	(stanKuchni (iloscNaczyn ?in&:(> ?in 20)))
=>
	(assert (decyzja (czynnosc ZMYWANIE)))
)

(defrule czy-smieci
	(g-moze-pracowac TAK)
	(stanKuchni (iloscSmieci ?is&:(> ?is 40)))
=>
	(assert (decyzja (czynnosc SMIECI)))
)

(defrule czy-pranie
	(g-moze-pracowac TAK)
	(stanLazienki (iloscBrudnychRzeczy ?ibr&:(> ?ibr 30)))
=>
	(assert (decyzja (czynnosc PRANIE)))
)

(defrule czy-sniadanie
	(jaki-posilek (posilek sniadanie))
	(g-moze-pracowac TAK)
=>
	(assert (decyzja (czynnosc GOTOWANIE) (cel SNIADANIE)))
	(assert (g-moze-pracowac NIE))
)

(defrule czy-obiad
	(jaki-posilek (posilek obiad))
	(g-moze-pracowac TAK)
=>
	(assert (decyzja (czynnosc GOTOWANIE) (cel OBIAD)))
	(assert (g-moze-pracowac NIE))
)

(defrule czy-kolacja
	(jaki-posilek (posilek kolacja))
	(g-moze-pracowac TAK)
=>
	(assert (decyzja (czynnosc GOTOWANIE) (cel KOLACJA)))
	(assert (g-moze-pracowac NIE))
)